package com.dkts.oil.router.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dkts.oil.config.OilConfig;
import com.dkts.oil.converter.GeometryConverter;
import com.dkts.oil.exception.OilException;
import com.dkts.oil.model.GHPoint;
import com.dkts.oil.router.RouteStrategy;
import com.dkts.oil.router.TransportRoute;
import com.dkts.oil.router.param.RouterInfo;
import com.dkts.oil.util.HttpUtils;
import com.dkts.oil.web.vo.request.RouteCommonRequest;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 1.1.2.2.5 消耗库到外场供油中心运输路线规划
 功能名称	消耗库到外场供油中心运输路线规划	功能标识	CADS_02_001
 功能描述	因为外场供油中心在机场内部，规划消耗库到靠近外场供油中心机场大门的运输路线，根据消耗库位置规划消耗库到机场大门的公路运输路线，在GIS地图上展示规划路线，估计运输用时，并生成消耗库到外场供油中心的公路运输的筹措方案
 输入	转运站位置、储备库位置
 处理逻辑	1）	判断消耗库是否在机场内部，如果在机场内部，则终止规划
 2）	如果消耗库在机场外部，规划消耗库到靠近外场供油中心机场大门的运输路线，如果需要新修公路，则使用储备库到消耗库运输路线规划时，新修的公路
 3）	规划完成后规划完成后保存路线规划结果，并在GIS地图上展示规划路线，已有公路与新建公路采用不同线路样式进行标识
 4）	计算运输用时，并生成路线规划说明
 */
@Service("XHK_TO_WCGYZX")
public class XhkToWcgyzxStrategy extends RouterCommonHelper implements RouteStrategy<RouteCommonRequest, RouterInfo> {

    @Autowired
    private OilConfig oilConfig;
    @Override
    public RouterInfo planRoute(RouteCommonRequest param) {

        Geometry geometry = check(param, TransportRoute.XHK_TO_WCGYZX);
        List<GHPoint> points = param.getPoints();

//        XHK到WCGY中心规划逻辑：
//        若XHK在机场外部，需规划第一、二、三段
//        第一段：最佳点A（CBK到XHK的公路终点）——>最佳点B（已有公路上）【新增路线】
//        第二段：最佳点B（已有公路上）——>最佳点C（已有公路上）【已有路线】
//        第三段：最佳点C（已有公路上）——>机场大门【新增路线】
//        若XHK在机场内部，终止规划
        Geometry pont= GeometryConverter.locationtechGeometryFactory.createPoint(new Coordinate(points.get(0).getLon(), points.get(0).getLat()));
        if (geometry.contains( pont)){
            throw new OilException("消耗库在机场内部，终止规划");
        }
        points.remove(points.size()-1);
        points.add(param.getAirportDoorPoint());
        JSONObject result = this.getRouteParam(param.getPoints(), "car");
        JSONArray data = HttpUtils.postRouteOil(oilConfig.getHighwayUrl() + "/route", JSONObject.toJSONString( result), points);
        return parseAllRouteSegments(data, param.getRouteModel(),1,param.getCreateNewRoadDistance(),2,param.getLocalRouteDistance());
    }
}
